home *** CD-ROM | disk | FTP | other *** search
/ Megahits 3 / Megahits 3 (1994)(GTI - Rhein-Main-Soft)(DE)[!].iso / module / utilities / modinfo / modinfo.s < prev   
Text File  |  1994-10-14  |  30KB  |  1,125 lines

  1. **********************************************************************
  2. **  program  : ModInfo                                              **
  3. **  version  : 1.2                                                  **
  4. **  author   : Gunther Nikl                                         **
  5. **  language : Devpac 2.14 (assembler)                              **
  6. **  bugs     : none known                                           **
  7. **********************************************************************
  8. **                                                                  **
  9. **    History                                                       **
  10. **    -------                                                       **
  11. ** v0.1 28-09-92  first simple version, module had to be "incbined" **
  12. **                in the program                                    **
  13. ** v1.0 01-10-92  support of commandline parsing with up to 10 args **
  14. **                (needs only 112 bytes + Kickstart 2.0 compatible) **
  15. **                can be made resident ( local data on the stack )  **
  16. **                abort possible with control-c                     **
  17. **                recognizes only modules with 31 samples           **
  18. **                added powerpacker support to decrunch packed mods **
  19. **                for processing                                    **
  20. **                help text if a '?' is found                       **
  21. **                error messages if something goes wrong            **
  22. ** v1.1 07-10-92  start from workbench possible                     **
  23. **                file select with filerequester from req.library   **
  24. **                if started without args or from workbench ( max.  **
  25. **                10 files selectable )                             **
  26. **                switch -d added to state a default directory for  **
  27. **                the filerequester ( switch and dirname can be     **
  28. **                seperated with white spaces, but not nessecary )  **
  29. ** v1.2 09-10-92  sets now directory delivered by wa_Lock from      **
  30. **                workbench message                                 **
  31. **                added recognition abilities for old soundtracker  **
  32. **                module (15 samples) and for startrekker 4 voices  **
  33. **                                                                  **
  34. **********************************************************************
  35.  
  36.         opt    o+,w-            ; optimize, no warnings
  37.  
  38. _LVOForbid        equ    -132
  39. _LVOAllocMem        equ    -198
  40. _LVOFreeMem        equ    -210
  41. _LVOSetSignal        equ    -306
  42. _LVOGetMsg        equ    -372
  43. _LVOReplyMsg        equ    -378
  44. _LVOWaitPort        equ    -384
  45. _LVOCloseLibrary    equ    -414
  46. _LVORawDoFmt        equ    -522
  47. _LVOOpenLibrary        equ    -552
  48.  
  49. _LVOOpen        equ    -30
  50. _LVOClose        equ    -36
  51. _LVORead        equ    -42
  52. _LVOWrite        equ    -48
  53. _LVOOutput        equ    -60
  54. _LVOSeek        equ    -66
  55. _LVOCurrentDir        equ    -126
  56.  
  57. _LVOFileRequest        equ    -84
  58. _LVOPurgeFiles        equ    -114
  59.  
  60. ADDSTR        macro
  61.         dc.w    \1.str-StringTab
  62. \1        equ    StrCount
  63. StrCount    set    \1+1
  64.         endm
  65.  
  66. bp        equr    a5
  67.  
  68. gb_SysBase    equ       -0    ; L        ; ueberschreibt Original A5 !!!!
  69. gb_DosBase    equ       -4    ; L
  70. gb_WbMsg    equ       -8    ; L
  71. gb_StdOut    equ      -12    ; L
  72. gb_ModDif    equ      -14    ; W
  73. gb_FlagLF    equ      -15    ; B
  74. gb_ArgC        equ      -16    ; B
  75. gb_ArgV        equ      -56    ; L*10
  76. gb_FileSize    equ      -60    ; L
  77. gb_FileBuf    equ      -64    ; L
  78. gb_ModPtr    equ      -68    ; L
  79. gb_FileLen    equ      -72    ; L
  80. gb_FileNames    equ      -76    ; L
  81. gb_EfxTab    equ     -108    ; W*16
  82. gb_FxeTab    equ     -140    ; W*16
  83. gb_FileReq    equ     -496    ; B*356
  84. gb_StringBuf    equ     -908    ; B*412
  85. gb_PrintBuf    equ    -1336    ; B*428
  86. gb_CheckBuf    equ    -1336    ; B*1084
  87. gb_SIZEOF    equ    -1336
  88.  
  89. start        link    bp,#gb_SIZEOF        ; Platz fuer Vars schaffen
  90.  
  91.         move.l    d0,d2            ; Argumentlaenge sichern
  92.         move.l    a0,a2            ; Argumentzeile sichern
  93.  
  94.         move.l    #(~gb_SIZEOF>>2),d1
  95.         move.l    bp,a1
  96. .clear        clr.l    -(a1)            ; Variablenbereich loeschen
  97.         dbra    d1,.clear
  98.  
  99.         move.l    4.w,a6
  100.         move.l    a6,gb_SysBase(bp)    ; ExecBase sichern
  101.  
  102.         move.l    276(a6),a4        ; SysBase->ThisTask
  103.  
  104.         move.l    184(a4),d4        ; pr_WindowPtr
  105.         moveq    #-1,d0
  106.         move.l    d0,184(a4)        ; keine DOS-Requester
  107.  
  108.         tst.l    172(a4)
  109.         bne.s    fromCLI            ; CLI-Start
  110.  
  111. fromWB        lea    92(a4),a0
  112.         jsr    _LVOWaitPort(a6)
  113.         lea    92(a4),a0
  114.         jsr    _LVOGetMsg(a6)
  115.         move.l    d0,gb_WbMsg(bp)        ; WB-Message
  116.  
  117.         bsr    OpenDOS
  118.         beq.s    exit2            ; kein DOS
  119.  
  120.         move.l    gb_WbMsg(bp),a1
  121.         move.l    36(a1),a1
  122.         move.l    (a1),d1
  123.         move.l    gb_DosBase(bp),a6
  124.         jsr    _LVOCurrentDir(a6)    ; aktuelles Directory setzen
  125.         lea    ConName.str(pc),a1
  126.         move.l    a1,d1
  127.         move.l    #1005,d2        ; MODE_OLDFILE
  128.         jsr    _LVOOpen(a6)
  129.         move.l    d0,160(a4)        ; pr_COS -> Window Handle
  130.         beq.s    exit2            ; Fehler
  131.         bsr.s    main
  132.         moveq    #Return,d0        ; "Press RETURN !"
  133.         bsr    PrintStr
  134.         move.l    160(a4),d1        ; pr_COS
  135.         lea    gb_PrintBuf(bp),a0
  136.         move.l    a0,d2
  137.         moveq    #1,d3
  138.         move.l    gb_DosBase(bp),a6
  139.         jsr    _LVORead(a6)        ; ein Zeichen lesen
  140.         move.l    160(a4),d1
  141.         jsr    _LVOClose(a6)        ; Fenster schliessen
  142.         move.l    gb_SysBase(bp),a6
  143. exit2        jsr    _LVOForbid(a6)
  144.         move.l    gb_WbMsg(bp),a1
  145.         jsr    _LVOReplyMsg(a6)    ; WB-Message beantworten
  146.         bra.s    exit            ; zum Hauptprogramm
  147.  
  148. fromCLI        clr.b    -1(a2,d2.w)        ; Zeile terminieren
  149.         bsr.s    OpenDOS
  150.         beq.s    exit            ; kein DOS
  151.         move.l    a2,a1
  152.         lea    gb_ArgV(bp),a2
  153.         moveq    #0,d2
  154.         bsr    BuildArgV        ; Argument-Vektor aufbauen
  155.         move.b    d2,gb_ArgC(bp)        ; Argumentzahl sichern
  156.         bsr.s    main            ; Hauptprogramm
  157. exit        bsr.s    CloseDOS
  158.         move.l    d4,184(a4)        ; alten WindowPtr setzen
  159.         moveq    #0,d0            ; ReturnCode = Alles Ok
  160.         unlk    bp            ; Stack aufraeumen
  161.         rts
  162.  
  163. OpenDOS        lea    DosName(pc),a1        ; dos.library
  164.         moveq    #33,d0
  165.         jsr    _LVOOpenLibrary(a6)    ; DOS oeffen
  166.         move.l    d0,gb_DosBase(bp)    ; sichern -> Flags stellen
  167.         rts
  168.  
  169. CloseDOS    move.l    gb_DosBase(bp),d0    ; DOS geoeffnet ?
  170.         beq.s    .quit            ; nein
  171.         move.l    d0,a1
  172.         jsr    _LVOCloseLibrary(a6)    ; DOS schliessen
  173. .quit        rts
  174.  
  175. *****************************************************************************
  176.  
  177. main        movem.l    d2/a2-3/a6,-(sp)
  178.  
  179.         move.l    gb_SysBase(bp),a6    ; ExecBase
  180.  
  181.         moveq    #PrgName,d0
  182.         bsr    PrintStr2        ; Copyright ausgeben
  183.  
  184.         lea    gb_ArgV(bp),a2        ; Argumentvektor
  185.         move.l    (a2),a0            ; 1. Argument
  186.         move.b    gb_ArgC(bp),d2        ; Parameter ?
  187.         beq.s    m_request2        ; FileRequester bringen
  188.         cmp.b    #'?',(a0)
  189.         bne.s    m_request        ; ist Filename
  190. m_use        moveq    #Usage,d0
  191.         bsr    PrintStr        ; Usage ausgeben
  192.         bra.s    m_quit
  193.  
  194. m_request    move.b    (a0)+,d0        ; erstes Zeichen
  195.         rol.w    #8,d0
  196.         move.b    (a0)+,d0        ; zweites Zeichen
  197.         bset    #5,d0
  198.         cmp.w    #'-d',d0
  199.         bne.s    m_loop            ; kein Standard Directory
  200.         tst.b    (a0)
  201.         bne.s    .onlyone        ; Name direkt angeschlossen
  202.         move.l    4(a2),d0
  203.         beq.s    m_use            ; Fehler -d ohne Argument !
  204.         move.l    d0,a0
  205. .onlyone    lea    gb_StringBuf(bp),a1
  206.         moveq    #127,d0
  207. .copy        move.b    (a0)+,(a1)+        ; DirName kopieren
  208.         dbeq    d0,.copy
  209. m_request2    bsr.s    ReqFiles        ; Files waehlen ( max. 10 )
  210.         bne.s    m_quit            ; Abbruch oder Fehler
  211.         move.b    gb_ArgC(bp),d2
  212. m_loop        move.l    (a2)+,a0        ; Argument holen
  213.         bsr    LoadFile        ; File laden
  214.         beq.s    m_calc            ; alles ok
  215.         subq.l    #5,d0            ; Speicherfehler ?
  216.         beq.s    m_quit            ; ja !
  217.         bra.s    m_cont
  218. m_calc        bsr    DoCalc            ; Effekte zaehlen & augeben
  219. m_cont        move.l    gb_FileBuf(bp),d0
  220.         beq.s    m_cont2            ; kein Puffer da
  221.         move.l    d0,a1
  222.         move.l    gb_FileSize(bp),d0    ; Puffergroesse
  223.         jsr    _LVOFreeMem(a6)        ; Puffer freigeben
  224.         clr.l    gb_FileBuf(bp)        ; Zeiger loeschen
  225. m_cont2        bsr.s    ChkBreak        ; Break-Check
  226.         bne.s    m_quit
  227.         subq.b    #1,d2            ; noch Argumente
  228.         bne.s    m_loop            ; ja
  229. m_quit        move.l    gb_FileNames(bp),d0    ; Puffer fuer Filenamen ?
  230.         beq.s    .quit
  231.         move.l    d0,a1
  232.         move.l    gb_FileLen(bp),d0    ; Pufferlaenge
  233.         jsr    _LVOFreeMem(a6)        ; Speicher freigeben
  234. .quit        movem.l    (sp)+,d2/a2-3/a6
  235.         rts                ; Auf Wiedersehen !
  236.  
  237. ChkBreak    moveq    #0,d0
  238.         move    #0,d1
  239.         jsr    _LVOSetSignal(a6)    ; gesetzte Signale holen
  240.         btst    #12,d0
  241.         beq.s    .quit            ; kein CTRL-C
  242.         moveq    #Break,d0    
  243.         bsr    PrintStr        ; Abbruch-Meldung
  244.         moveq    #1,d0
  245. .quit        rts
  246.  
  247. *****************************************************************************
  248.  
  249. ReqFiles    movem.l    d2-3/a2-4/a6,-(sp)
  250.  
  251.         moveq    #ReqNeed,d3        ; REQ-Fehler
  252.         lea    ReqName(pc),a1
  253.         moveq    #0,d0
  254.         move.l    gb_SysBase(bp),a6
  255.         jsr    _LVOOpenLibrary(a6)    ; Lib oeffen
  256.         move.l    d0,a4
  257.         move.l    a4,d0
  258.         beq    .quit            ; kein REQ
  259.  
  260.         moveq    #LoadErr,d3        ; REQ-Abbruch
  261.         lea    gb_FileReq(bp),a0    ; Request-Struktur
  262.         lea    ReqTitle.str(pc),a1
  263.         move.l    a1,2(a0)        ; Requester Titel
  264.         lea    gb_StringBuf(bp),a1
  265.         move.l    a1,6(a0)        ; DirName
  266.         lea    gb_StringBuf+132(bp),a1
  267.         move.l    a1,14(a0)        ; PathName
  268.         move.w    #10,22(a0)        ; MaxExtSelect
  269.         move.l    #4118,30(a0)        ; ExtSel,Cache,IBut & Load
  270.         moveq    #2,d0
  271.         move.w    d0,34(a0)        ; DirNameColour
  272.         move.w    d0,38(a0)        ; DevNameColour
  273.         move.l    a4,a6
  274.         jsr    _LVOFileRequest(a6)    ; Fragen wat nu ...
  275.         tst.l    d0
  276.         beq    .purge            ; nichts ausgewaehlt
  277.  
  278. .one        move.l    gb_FileReq+116(bp),d0    ; mehrere Files ?
  279.         bne.s    .multi
  280.         move.l    gb_FileReq+14(bp),a0    ; PathName
  281.         moveq    #-1,d0
  282. .flen        tst.b    (a0)+
  283.         dbeq    d0,.flen
  284.         not.l    d0            ; Speicherbedarf
  285.         bsr    AllocFN
  286.         beq    .purge
  287.         move.b    #1,gb_ArgC(bp)        ; 1 Argument
  288.         move.l    d0,gb_ArgV(bp)        ; Adresse des Arguments
  289.         move.l    gb_FileReq+14(bp),a1
  290. .copy        move.b    (a1)+,(a0)+        ; PathName kopieren
  291.         bne.s    .copy
  292.         bra.s    .allok
  293.  
  294. .multi        moveq    #-2,d2            ; mindestens ein Byte lang 
  295.         move.l    gb_FileReq+6(bp),a0
  296. .dlen        tst.b    (a0)+
  297.         dbeq    d2,.dlen
  298.         not.l    d2            ; DirSize
  299.         move.l    d0,a1            ; ExtendedSelect
  300.         moveq    #0,d0
  301. .count        addq.w    #1,d0            ; Argumentzahl erhoehen
  302.         move.l    (a1),d1
  303.         move.l    d1,a1
  304.         bne.s    .count            ; weitere Namen
  305.         move.b    d0,gb_ArgC(bp)        ; Argumentzahl
  306.         mulu    d0,d2            ; DirSize*Fileanzahl
  307.         lsl.w    #5,d0            ; Fileanzahl*32
  308.         add.w    d2,d0            ; Speichergroesse
  309.         bsr.s    AllocFN
  310.         beq.s    .purge            ; kein Speicher
  311.         move.l    gb_FileReq+116(bp),a2    ; ExtendedSelect
  312.         lea    gb_ArgV(bp),a3        ; Argument-Vektor
  313. .copy2        move.l    a0,(a3)+        ; Adresse nach ArgV
  314.         move.l    gb_FileReq+6(bp),a1
  315.         tst.b    (a1)
  316.         beq.s    2$            ; kein Pfadname
  317. 1$        move.b    (a1)+,(a0)+        ; Pfadname kopieren
  318.         bne.s    1$
  319.         subq.w    #2,a0
  320.         cmp.b    #':',(a0)+
  321.         beq.s    2$            ; Devicekennung da
  322.         moveq    #'/',d0
  323.         cmp.b    -1(a0),d0
  324.         beq.s    2$            ; Pfadkennung vorhanden
  325.         move.b    d0,(a0)+        ; Pfadkennung eintragen
  326. 2$        move.w    4(a2),d0        ; Laenge des Dateinamen
  327.         lea    12(a2),a1
  328.         bra.s    4$
  329. 3$        move.b    (a1)+,(a0)+        ; Name kopieren
  330. 4$        dbra    d0,3$
  331.         clr.b    (a0)+            ; String terminieren
  332.         move.l    (a2),d2
  333.         move.l    d2,a2
  334.         bne.s    .copy2            ; weitere Files
  335.  
  336. .allok        moveq    #0,d3            ; alles ok
  337.  
  338. .purge        lea    gb_FileReq(bp),a0    ; dem Request assoziierte
  339.         move.l    a4,a6
  340.         jsr    _LVOPurgeFiles(a6)    ; Speicherbereiche freigeben
  341.         move.l    a4,a1
  342.         move.l    gb_SysBase(bp),a6
  343.         jsr    _LVOCloseLibrary(a6)    ; REQ schliessen
  344.  
  345. .quit        move.l    d3,d0            ; Fehler aufgetreten
  346.         beq.s    .quit2
  347.         lea    ReqName(pc),a1
  348.         bsr    PrintStr        ; Meldung ausgeben
  349.         move.l    d3,d0            ; Flags wieder stellen
  350.  
  351. .quit2        movem.l    (sp)+,d2-3/a2-4/a6
  352.         rts
  353.  
  354. AllocFN        moveq    #MemErr,d3        ; Speicherfehler
  355.         move.l    d0,gb_FileLen(bp)    ; Speicherbedarf
  356.         moveq    #1,d1            ; Public Memory
  357.         move.l    gb_SysBase(bp),a6
  358.         jsr    _LVOAllocMem(a6)
  359.         move.l    d0,a0
  360.         move.l    d0,gb_FileNames(bp)    ; Ptr eintragen
  361.         rts
  362.  
  363. *****************************************************************************
  364.  
  365. LoadFile    movem.l    d2-7/a2-3/a6,-(sp)
  366.  
  367.         lea    gb_CheckBuf(bp),a2
  368.         move.l    a0,a3            ; Name sichern
  369.         move.l    gb_DosBase(bp),a6
  370.  
  371.         move.l    a2,a1
  372. .copy        move.b    (a0)+,(a1)+        ; Filenamen kopieren
  373.         bne.s    .copy
  374.  
  375.         moveq    #FileErr,d7        ; File-Fehler
  376.         move.l    a2,d1
  377.         move.l    #1005,d2
  378.         jsr    _LVOOpen(a6)        ; Datei öffnen
  379.         move.l    d0,d4
  380.         beq    .quit2            ; File nicht gefunden
  381.  
  382.         moveq    #ModErr,d7        ; kein Modul
  383.         move.l    d4,d1
  384.         move.l    a2,d2
  385.         move.l    #1084,d3
  386.         jsr    _LVORead(a6)        ; 1084 Bytes lesen
  387.         cmp.l    d0,d3
  388.         bne    .closef            ; zu klein ( <1084 )
  389.  
  390.         move.l    (a2),d6            ; erste 4 Bytes der Datei
  391.  
  392.         moveq    #ReadErr,d7        ; Lesefehler
  393.         move.l    d4,d1
  394.         moveq    #-4,d2
  395.         moveq    #1,d3            ; OFFSET_END
  396.         jsr    _LVOSeek(a6)        ; zum Dateiende-4
  397.         tst.l    d0
  398.         bmi.s    .closef            ; Seekfehler
  399.  
  400.         move.l    d4,d1
  401.         move.l    a2,d2
  402.         moveq    #4,d3
  403.         jsr    _LVORead(a6)        ; 4 Bytes lesen
  404.         cmp.l    d0,d3
  405.         bne.s    .closef            ; Lesefehler
  406.  
  407.         move.l    d4,d1
  408.         moveq    #0,d2
  409.         moveq    #-1,d3            ; OFFSET_BEGINNING
  410.         jsr    _LVOSeek(a6)        ; zum Dateianfang
  411.         move.l    d0,d3            ; Wert sichern
  412.         bmi.s    .closef            ; Seekfehler
  413.  
  414.         exg.l    d2,d6            ; Null nach D6
  415.         cmp.l    #'PP20',d2        ; PowerPacked ?
  416.         bne.s    .notpp
  417.         move.l    (a2),d6            ; richtige Laenge
  418.         lsr.l    #8,d6            ; extrahieren
  419.         moveq    #16,d0            ; 16 Bytes als
  420.         add.l    d0,d6            ; Sicherheit dazu
  421. .notpp        exg.l    d3,d6
  422.         tst.l    d3
  423.         bne.s    .ok            ; D6 <> 0 -> gepacket !
  424.         exg.l    d3,d6            ; Abstand zurueck nach d0
  425.  
  426.         bsr.s    ModCheck        ; Modul prüfen
  427.         bne.s    .closef            ; nein
  428.  
  429.         move.l    #66620,d0
  430.         cmp.l    d3,d0            ; Abstand > 66620 ?
  431.         bcc.s    .ok            ; nein
  432.         move.l    d0,d3
  433. .ok        move.l    d3,gb_FileSize(bp)    ; Puffergroesse
  434.  
  435.         moveq    #MemErr,d7        ; Speicher-Fehler        
  436.         move.l    d3,d0            ; Speichergroesse
  437.         moveq    #1,d1
  438.         move.l    gb_SysBase(bp),a6
  439.         jsr    _LVOAllocMem(a6)    ; Puffer allokieren
  440.         move.l    d0,gb_FileBuf(bp)
  441.         move.l    gb_DosBase(bp),a6
  442.         beq.s    .closef            ; kein Speicher
  443.         move.l    d0,gb_ModPtr(bp)    ; if PP -> FileBuf <> ModPtr!
  444.  
  445.         moveq    #ReadErr,d7        ; Lese-Fehler
  446.         move.l    d4,d1
  447.         move.l    gb_FileBuf(bp),d2
  448.         tst.l    d6            ; gepackte Laenge ( <>0 )
  449.         beq.s    .read
  450.         move.l    d6,d3            ; powerpacked
  451. .read        jsr    _LVORead(a6)        ; Header & Pattern einlesen
  452.         cmp.l    d0,d3
  453.         bne.s    .closef            ; Lesefehler
  454.  
  455.         moveq    #0,d7            ; kein Fehler
  456.  
  457. .closef        move.l    d4,d1
  458.         jsr    _LVOClose(a6)        ; File schliessen
  459.  
  460. .quit        tst.l    d6            ; gepackt ?
  461.         beq.s    .quit2
  462.         move.l    gb_FileBuf(bp),a1    ; DeCrunch Puffer
  463.         lea    0(a1,d6.l),a0        ; EndCrunch
  464.         lea    16(a1),a1
  465.         move.l    a1,gb_ModPtr(bp)    ; richtiger Module-Ptr
  466.         addq.l    #4,a2            ; DeCrunch-Bits
  467.         bsr    PPDeCrunch        ; auspacken
  468.         move.l    a1,a2
  469.         bsr.s    ModCheck        ; prüfen
  470.  
  471. .quit2        move.l    d7,d0            ; alles ok ?
  472.         beq.s    .quit3            ; ja
  473.         move.l    a3,a1
  474.         bsr    PrintStr        ; Fehler-Meldung ausgeben
  475.         move.l    d7,d0            ; Fehler-Nr zurueckgeben
  476.  
  477. .quit3        movem.l    (sp)+,d2-7/a2-3/a6
  478.         rts
  479.  
  480. ModCheck    clr.w    gb_ModDif(bp)        ; loeschen
  481.         cmp.l    #'M.K.',1080(a2)
  482.         beq.s    chkok            ; 31 Samples - NT oder PT
  483.         cmp.l    #'FLT4',1080(a2)
  484.         beq.s    chkok            ; 31 Samples - StarTrekker
  485.         moveq    #30,d2
  486.         clr.w    gb_ModDif(bp)
  487.         bsr.s    DoCheck            ; Test auf 31 Samples
  488.         beq.s    chkquit2        ; ist Modul
  489.         moveq    #14,d2
  490.         move.w    #480,gb_ModDif(bp)    ; Test auf 15 Samples
  491. DoCheck        moveq    #ModErr,d7        ; kein Module
  492.         lea    950(a2),a0        ; Zeiger auf SongLen
  493.         suba.w    gb_ModDif(bp),a0
  494.         moveq    #0,d0
  495.         move.b    (a0)+,d0
  496.         beq.s    chkquit            ; SongLen == 0 - ungueltig !
  497.         bmi.s    chkquit            ; SongLen >127 - ungueltig !
  498.         move.b    (a0)+,d1
  499.         beq.s    chkquit            ; CiaSpeed == 0 - ungueltig !
  500.         addq.b    #1,d1
  501.         beq.s    chkquit            ;  Speed == $ff - ungueltig !
  502.         move.b    d0,d1
  503. chkpattl    cmp.b    0(a0,d0.w),d1        ; PatterListe pruefen
  504.         bcs.s    chkquit            ; PattNum > SongLen !
  505.         dbra    d0,chkpattl
  506.         moveq    #0,d1
  507.         lea    44(a2),a0        ; FineTune & Volume
  508. chkvol1        moveq    #15,d0
  509.         sub.b    (a0)+,d0
  510.         bcs.s    chkquit            ; FineTune > 15 - ungueltig !
  511. chkvol2        moveq    #64,d0
  512.         sub.b    (a0),d0
  513.         bcs.s    chkquit            ; Volume  >64 - ungueltig !
  514.         add.b    d0,d0
  515.         bmi.s    chkvol3            ; Volume == 0 - nicht ok !
  516.         addq.b    #1,d1
  517. chkvol3        lea    29(a0),a0
  518.         dbra    d2,chkvol1
  519.         subq.b    #3,d1
  520.         bcs.s    chkquit            ; Zaehler < 3 - ungueltig !
  521. chkok        moveq    #0,d7            ; vieleicht Modul !
  522. chkquit        move.l    d7,d0            ; Flags stellen
  523. chkquit2    rts
  524.  
  525. *****************************************************************************
  526.  
  527. DoCalc        movem.l    a2-3,-(sp)        ; Regs sichern
  528.  
  529.         tst.b    gb_FlagLF(bp)        ; LF noetig ?
  530.         beq.s    .nolf
  531.         bsr.s    PrintLF            ; 1 x LF ausgeben
  532.         clr.b    gb_FlagLF(bp)        ; Flag loeschen
  533. .nolf        move.l    gb_ModPtr(bp),a0    ; Header & Pattern
  534.         bsr    CalcEffects        ; Effekte zaehlen
  535.         movem.w    d0-1,-(sp)        ; SongLen & Pattern sichern
  536.         bsr    MakeString        ; Formatstring aufbauen
  537.         lea    gb_StringBuf(bp),a0    ; Formatstring
  538.         lea    gb_EfxTab(bp),a1    ; gezaehlte Effekte
  539.         bsr.s    DoFormat        ; Ausgabe aufbauen
  540.         move.l    gb_ModPtr(bp),a0    ; Modulname kopieren
  541.         lea    gb_PrintBuf+71(bp),a1    ; 2. Zeile
  542.         moveq    #19,d0            ; max. 20 Zeichen oder bis
  543. .copy        move.b    (a0)+,(a1)+        ; zum Null-Byte kopieren
  544.         dbeq    d0,.copy
  545.         bne.s    1$            ; falls < 20 
  546.         move.b    #' ',-(a1)        ; Null-Byte loeschen
  547. 1$        lea    Patts.str(pc),a0
  548.         lea    gb_PrintBuf+214(bp),a3    ; 4. Zeile
  549.         bsr.s    FmtInfo            ; Pattern eintragen
  550.         addq.l    #2,sp
  551.         lea    SongLen.str(pc),a0
  552.         lea    gb_PrintBuf+285(bp),a3    ; 5 Zeile
  553.         bsr.s    FmtInfo            ; Songlaenge eintragen
  554.         addq.l    #2,sp
  555.         bsr.s    Print            ; String ausgeben
  556.         lea    gb_EfxTab(bp),a1    ; E-Cmds ueberpruefen
  557.         move.w    28(a1),d1
  558.         beq.s    .quit            ; keine E-Cmds
  559.         lea    gb_FxeTab(bp),a1    ; gezaehlte E-Cmds
  560.         cmp.w    (a1),d1
  561.         beq.s    .quit            ; nur Filterkommandos
  562.         lea    gb_StringBuf+71(bp),a0    ; Headerzeile auslassen
  563.         bsr.s    DoFormat        ; Ausgabe aufbauen
  564.         lea    ECmds.str(pc),a0    ; ECmd-String dazu
  565.         lea    gb_PrintBuf+14(bp),a1
  566.         moveq    #5,d0
  567. .copy2        move.b    (a0)+,(a1)+        ; String kopieren
  568.         dbra    d0,.copy2
  569.         bsr.s    Print            ; String ausgeben
  570.  
  571. .quit        movem.l    (sp)+,a2-3        ; Regs restaurieren
  572.  
  573. PrintLF        move.w    #$0a00,gb_PrintBuf(bp)    ; LF ausgeben
  574.         bra.s    Print
  575.  
  576. *****************************************************************************
  577.  
  578. FmtInfo        lea    4(sp),a1        ; Addresse des Parameters
  579.         bsr.s    DoFmt
  580. 1$        tst.b    (a3)+            ; Stringende suchen
  581.         bne.s    1$
  582.         move.b    #' ',-(a3)        ; Null loeschen
  583.         rts
  584.  
  585. DoFormat    lea    gb_PrintBuf(bp),a3    ; Ausgabepuffer
  586. DoFmt        lea    sc_put(pc),a2        ; Puffer-Routine
  587.         move.l    gb_SysBase(bp),a6
  588.         jmp    _LVORawDoFmt(a6)    ; formatieren
  589. sc_put        move.b    d0,(a3)+        ; Zeichen in den Puffer
  590.         rts
  591.  
  592. PrintStr    st    gb_FlagLF(bp)
  593. PrintStr2    lea    StringTab(pc),a0    ; StringTabelle
  594.         add.w    d0,d0
  595.         add.w    0(a0,d0.w),a0        ; Offset dazu
  596.         move.l    a1,-(sp)
  597.         move.l    sp,a1            ; Zeiger auf den Zeiger
  598.         bsr.s    DoFormat        ; in den Ausgabepuffer
  599.         addq.l    #4,sp            ; Stack aufraeumen
  600.  
  601. Print        movem.l    d2-3/a6,-(sp)        ; Regs sichern
  602.         move.l    gb_DosBase(bp),a6
  603.         jsr    _LVOOutput(a6)
  604.         lea    gb_PrintBuf(bp),a0
  605.         move.l    a0,d2            ; Ausgabepuffer
  606.         moveq    #-1,d3
  607. .size        tst.b    (a0)+
  608.         dbeq    d3,.size
  609.         not.l    d3            ; Ausgabelaenge
  610.         jsr    _LVOWrite(a6)
  611.         movem.l    (sp)+,d2-3/a6        ; Regs zurueck
  612.         rts
  613.  
  614. *****************************************************************************
  615.  
  616. CalcEffects    movem.l    d2/a2,-(sp)        ; Effekte bestimmen & zaehlen
  617.         moveq    #0,d0
  618.         moveq    #0,d1
  619.         moveq    #127,d2
  620.         lea    $3b8(a0),a0
  621.         suba.w    gb_ModDif(bp),a0    ; 15/31 Samples
  622. .cloop1        move.b    (a0)+,d1        ; groesste PattNr suchen - D0
  623.         cmp.b    d0,d1
  624.         bcs.s    .cnext1
  625.         move.l    d1,d0
  626. .cnext1        dbra    d2,.cloop1
  627.         move.b    -130(a0),d1
  628.         movem.l    d0-1,-(sp)        ; PattNr & SongLen sichern
  629.         tst.w    gb_ModDif(bp)
  630.         bne.s    .not31
  631.         addq.l    #4,a0            ; auf Patternanfang stellen
  632. .not31        lea    gb_FxeTab(bp),a1
  633.         moveq    #15,d1
  634. .clear        clr.l    (a1)+            ; Zaehler loeschen
  635.         dbra    d1,.clear
  636.         lea    gb_EfxTab(bp),a1    ; Effekte $0 - $F
  637.         lea    gb_FxeTab(bp),a2    ;  E-Cmds $0 - $F
  638. .cloop2        move.w    #255,d1            ; Patternlaenge 1024 Bytes
  639. .cloop3        move.w    2(a0),d2
  640.         and.w    #$0fff,d2
  641.         beq.s    .cnext3            ; kein Effekt
  642.         lsr.w    #8,d2            ; EffektNr ins Low-Byte
  643.         add.w    d2,d2            ; Word-Offset
  644.         addq.w    #1,0(a1,d2.w)        ; Anzahl erhoehen
  645. ;        bcs.s    ende
  646.         cmp.w    #28,d2            ; E-Cmd ?
  647.         bne.s    .cnext3            ; nein
  648.         move.b    3(a0),d2        ; Effekt-Parameter
  649.         lsr.w    #4,d2            ; E-Nr ins Low-Nibble
  650.         add.w    d2,d2            ; Word-Offset
  651.         addq.w    #1,0(a2,d2.w)        ; Anzahl erhoehen
  652. .cnext3        addq.l    #4,a0            ; naechste Position
  653.         dbra    d1,.cloop3
  654.         dbra    d0,.cloop2        ; naechstes Pattern
  655.         movem.l    (sp)+,d0-2/a2        ; PattNr,SongLen & d2/a2
  656.         rts
  657.  
  658. *****************************************************************************
  659.  
  660. MakeString    movem.l    d2/a2,-(sp)        ; Formatstring aufbauen
  661.         lea    gb_StringBuf(bp),a0    ; wohin
  662.         lea    HexString.str(pc),a2    ; Effektnummer als ByteString
  663.         bsr.s    PutStartEnd        ; Kopfzeile
  664.         moveq    #3,d2
  665. .loop1        bsr.s    PutSpaces        ; 21 Leerzeichen
  666.         moveq    #45,d1
  667.         lea    Template.str(pc),a1    ; eine Zeile als Vorlage
  668. .loop2        move.b    (a1)+,d0        ; Nummernposition ?
  669.         bpl.s    .next2
  670.         move.b    (a2)+,d0        ; aktuelle Nr eintragen
  671. .next2        move.b    d0,(a0)+        ; Zeichen speichern
  672.         dbra    d1,.loop2
  673.         dbra    d2,.loop1
  674.         bsr.s    PutStartEnd        ; Fusszeile
  675.         clr.b    (a0)
  676.         movem.l    (sp)+,d2/a2
  677.         rts
  678.  
  679. PutStartEnd    bsr.s    PutSpaces        ; 21 Spaces an den Anfang
  680.         moveq    #48,d1
  681.         moveq    #'-',d0    
  682. .loop        move.b    d0,(a0)+        ; 49 mal eintragen
  683.         dbra    d1,.loop
  684.         move.b    #10,(a0)+        ; LF als Abschluss
  685.         rts
  686.  
  687. PutSpaces    moveq    #20,d1
  688.         moveq    #' ',d0
  689. .loop        move.b    d0,(a0)+        ; 21 Spaces eintragen
  690.         dbra    d1,.loop
  691.         rts
  692.  
  693. *****************************************************************************
  694.  
  695. ; a1 - Zeiger in Kommandozeile
  696. ; d2 - argc
  697. ; a2 - argv
  698.  
  699. BuildArgV    bsr.s    GetNext            ; Argument suchen
  700.         bmi.s    doquote            ; Quotierung
  701.         beq.s    dosemi            ; Kommentar beendet alles
  702.         bcs.s    BuildArgV        ; Trennzeichen
  703.         lea    -1(a1),a0        ; Argumentanfang
  704.         bsr.s    BumpArgV        ; argc+1 & ptr nach argv
  705. build_2        bsr.s    GetNext            ; Trennzeichen suchen
  706.         beq.s    dosemi            ; Kommentar beendet alles
  707.         bcc.s    build_2            ; kein Trennzeichen
  708.         clr.b    -1(a1)            ; Ende kennzeichen
  709.         bra.s    BuildArgV        ; weiter machen
  710.  
  711. doquote        move.l    a1,a0            ; Argumentanfang
  712.         bsr.s    BumpArgV        ; argc+1 & ptr nach argv
  713. quote_2        bsr.s    GetNext            ; Quotierung suchen
  714.         bpl.s    quote_2            ; keine Quotierung
  715.         clr.b    -1(a1)            ; Ende kennzeichen
  716. quote_3        bsr.s    GetNext            ; Trennzeichen suchen
  717.         beq.s    dosemi            ; Kommentar beendet alles
  718.         bcc.s    quote_3            ; kein Trennzeichen
  719.         bra.s    BuildArgV        ; weiter machen 
  720.  
  721. dosemi        clr.b    -(a1)            ; Semikolon loeschen
  722.         bra.s    BuildArgV
  723.  
  724. BumpArgV    cmp.w    #10,d2            ; max argc erreicht ?
  725.         bcc.s    .full
  726.         move.l    a0,(a2)+        ; argptr eintragen
  727.         addq.w    #1,d2            ; argc+1
  728. .full        rts
  729.  
  730. GetNext        move.b    (a1)+,d0        ; Zeichen pruefen
  731.         beq.s    BuildRdy
  732.         moveq    #-3,d1            ; N=1,Z=0,C=0 -> Quote
  733.         cmp.b    #'"',d0
  734.         beq.s    .quit
  735.         moveq    #-2,d1            ; N=0,Z=1,C=1 -> Semikolon
  736.         cmp.b    #';',d0
  737.         beq.s    .quit
  738.         moveq    #-1,d1            ; N=0,Z=0,C=1 -> Trennzeichen
  739.         cmp.b    #'=',d0
  740.         beq.s    .quit
  741.         cmp.b    #' ',d0
  742.         beq.s    .quit
  743.         cmp.b    #9,d0
  744.         beq.s    .quit
  745.         moveq    #0,d1            ; N=0,Z=0,C=0 -> Rest
  746. .quit        addq.l    #2,d1            ; Flags stellen (siehe oben)
  747.         rts
  748.  
  749. BuildRdy    addq.l    #4,sp            ; richtige Adresse einstellen
  750.         rts
  751.  
  752. *****************************************************************************
  753.  
  754. ; PowerPacker assembler decrunch-subroutine
  755. ;
  756. ; PPDecrunch (endcrun, buffer, efficiency);
  757. ;               a0       a1        a2
  758.  
  759. PPDeCrunch    movem.l    d0-7/a0-5,-(sp)
  760.         moveq    #0,d4
  761.         moveq    #1,d5
  762.         moveq    #24,d6
  763.         move.w    #255,d7
  764.         movea.l    a1,a3
  765.         lea    myDecrTab(pc),a4
  766.         lea    $dff1a2,a5        ; DeCrunch Effekt
  767.         move.l    -(a0),d1
  768.         tst.b    d1
  769.         beq.s    ppdecr_02
  770.         lsr.l    #1,d5
  771.         beq.s    ppdecr_10
  772. ppdecr_01    subq.b    #1,d1
  773.         lsr.l    d1,d5
  774. ppdecr_02    lsr.l    #8,d1
  775.         adda.l    d1,a1
  776. ppdecr_03    lsr.l    #1,d5
  777.         beq.s    ppdecr_11
  778. ppdecr_04    bcs    ppdecr_21
  779.         moveq    #0,d2
  780. ppdecr_05    moveq    #0,d1
  781.         lsr.l    #1,d5
  782.         beq.s    ppdecr_12
  783. ppdecr_06    roxl.w    #1,d1
  784.         lsr.l    #1,d5
  785.         beq.s    ppdecr_13
  786. ppdecr_07    roxl.w    #1,d1
  787.         add.w    d1,d2
  788.         subq.w    #3,d1
  789.         beq.s    ppdecr_05
  790.         moveq    #0,d0
  791. ppdecr_08    move.b    d5,d4
  792.         lsr.l    #8,d5
  793.         beq.s    ppdecr_16
  794. ppdecr_09    move.b    -128(a4,d4.w),d0
  795.         move.b    d0,-(a1)
  796.         dbra    d2,ppdecr_08
  797.         move.w    a1,(a5)
  798.         cmpa.l    a1,a3
  799.         bcs.s    ppdecr_21
  800.         bra    ppdecr_52
  801.  
  802. ppdecr_10    move.l    -(a0),d5
  803.         roxr.l    #1,d5
  804.         bra.s    ppdecr_01
  805.  
  806. ppdecr_11    move.l    -(a0),d5
  807.         roxr.l    #1,d5
  808.         bra.s    ppdecr_04
  809.  
  810. ppdecr_12    move.l    -(a0),d5
  811.         roxr.l    #1,d5
  812.         bra.s    ppdecr_06
  813.  
  814. ppdecr_13    move.l    -(a0),d5
  815.         roxr.l    #1,d5
  816.         bra.s    ppdecr_07
  817.  
  818. ppdecr_14    move.l    -(a0),d5
  819.         roxr.l    #1,d5
  820.         bra.s    ppdecr_22
  821.  
  822. ppdecr_15    move.l    -(a0),d5
  823.         roxr.l    #1,d5
  824.         bra.s    ppdecr_23
  825.  
  826. ppdecr_16    move.b    127(a4,d4.w),d0
  827.         move.l    -(a0),d5
  828.         move.w    d5,d3
  829.         lsl.w    d0,d3
  830.         bchg    d0,d3
  831.         eor.w    d3,d4
  832.         and.w    d7,d4
  833.         moveq    #8,d1
  834.         sub.w    d0,d1
  835.         lsr.l    d1,d5
  836.         add.w    d6,d0
  837.         bset    d0,d5
  838.         bra.s    ppdecr_09
  839.  
  840. ppdecr_17    move.b    127(a4,d4.w),d0
  841.         move.l    -(a0),d5
  842.         move.w    d5,d3
  843.         lsl.w    d0,d3
  844.         bchg    d0,d3
  845.         eor.w    d3,d4
  846.         and.w    d7,d4
  847.         moveq    #8,d1
  848.         sub.w    d0,d1
  849.         lsr.l    d1,d5
  850.         add.w    d6,d0
  851.         bset    d0,d5
  852.         bra.s    ppdecr_24
  853.  
  854. ppdecr_18    move.l    -(a0),d5
  855.         roxr.l    #1,d5
  856.         bra.s    ppdecr_30
  857.  
  858. ppdecr_19    move.l    -(a0),d5
  859.         roxr.l    #1,d5
  860.         bra.s    ppdecr_31
  861.  
  862. ppdecr_20    move.l    -(a0),d5
  863.         roxr.l    #1,d5
  864.         bra.s    ppdecr_32
  865.  
  866. ppdecr_21    moveq    #0,d2
  867.         lsr.l    #1,d5
  868.         beq.s    ppdecr_14
  869. ppdecr_22    roxl.w    #1,d2
  870.         lsr.l    #1,d5
  871.         beq.s    ppdecr_15
  872. ppdecr_23    roxl.w    #1,d2
  873.         move.b    d5,d4
  874.         lsr.l    #8,d5
  875.         beq.s    ppdecr_17
  876. ppdecr_24    moveq    #0,d3
  877.         move.b    -128(a4,d4.w),d3
  878.         cmp.w    #3,d2
  879.         bne.s    ppdecr_43
  880.         bclr    #7,d3
  881.         beq.s    ppdecr_36
  882.         moveq    #13,d0
  883.         sub.b    0(a2,d2.w),d0
  884.         move.w    d0,d1
  885.         add.w    d0,d0
  886.         add.w    d1,d0
  887.         add.w    d0,d0
  888.         jmp    ppdecr_28(pc,d0.w)
  889.  
  890. ppdecr_25    move.l    -(a0),d5
  891.         roxr.l    #1,d5
  892.         bra.s    ppdecr_33
  893.  
  894. ppdecr_26    move.l    -(a0),d5
  895.         roxr.l    #1,d5
  896.         bra.s    ppdecr_34
  897.  
  898. ppdecr_27    move.l    -(a0),d5
  899.         roxr.l    #1,d5
  900.         bra.s    ppdecr_35
  901.  
  902. ppdecr_28    lsr.l    #1,d5
  903.         beq.s    ppdecr_18
  904. ppdecr_30    roxl.w    #1,d3
  905.         lsr.l    #1,d5
  906.         beq.s    ppdecr_19
  907. ppdecr_31    roxl.w    #1,d3
  908.         lsr.l    #1,d5
  909.         beq.s    ppdecr_20
  910. ppdecr_32    roxl.w    #1,d3
  911.         lsr.l    #1,d5
  912.         beq.s    ppdecr_25
  913. ppdecr_33    roxl.w    #1,d3
  914.         lsr.l    #1,d5
  915.         beq.s    ppdecr_26
  916. ppdecr_34    roxl.w    #1,d3
  917.         lsr.l    #1,d5
  918.         beq.s    ppdecr_27
  919. ppdecr_35    roxl.w    #1,d3
  920. ppdecr_36    moveq    #0,d1
  921.         lsr.l    #1,d5
  922.         beq.s    ppdecr_40
  923. ppdecr_37    roxl.w    #1,d1
  924.         lsr.l    #1,d5
  925.         beq.s    ppdecr_41
  926. ppdecr_38    roxl.w    #1,d1
  927.         lsr.l    #1,d5
  928.         beq.s    ppdecr_42
  929. ppdecr_39    roxl.w    #1,d1
  930.         add.w    d1,d2
  931.         subq.w    #7,d1
  932.         beq.s    ppdecr_36
  933.         bra.s    ppdecr_50
  934.  
  935. ppdecr_40    move.l    -(a0),d5
  936.         roxr.l    #1,d5
  937.         bra.s    ppdecr_37
  938.  
  939. ppdecr_41    move.l    -(a0),d5
  940.         roxr.l    #1,d5
  941.         bra.s    ppdecr_38
  942.  
  943. ppdecr_42    move.l    -(a0),d5
  944.         roxr.l    #1,d5
  945.         bra.s    ppdecr_39
  946.  
  947. ppdecr_43    moveq    #13,d0
  948.         sub.b    0(a2,d2.w),d0
  949.         move.w    d0,d1
  950.         add.w    d0,d0
  951.         add.w    d1,d0
  952.         add.w    d0,d0
  953.         jmp    ppdecr_44(pc,d0.w)
  954.  
  955. ppdecr_44    lsr.l    #1,d5
  956.         beq.s    ppdecr_53
  957. ppdecr_45    roxl.w    #1,d3
  958.         lsr.l    #1,d5
  959.         beq.s    ppdecr_54
  960. ppdecr_46    roxl.w    #1,d3
  961.         lsr.l    #1,d5
  962.         beq.s    ppdecr_55
  963. ppdecr_47    roxl.w    #1,d3
  964.         lsr.l    #1,d5
  965.         beq.s    ppdecr_56
  966. ppdecr_48    roxl.w    #1,d3
  967.         lsr.l    #1,d5
  968.         beq.s    ppdecr_57
  969. ppdecr_49    roxl.w    #1,d3
  970. ppdecr_50    move.b    0(a1,d3.w),-(a1)
  971. ppdecr_51    move.b    0(a1,d3.w),-(a1)
  972.         dbra    d2,ppdecr_51
  973.         move.w    a1,(a5)
  974.         cmpa.l    a1,a3
  975.         bcs    ppdecr_03
  976. ppdecr_52    movem.l    (sp)+,d0-7/a0-5
  977.         rts
  978.  
  979. ppdecr_53    move.l    -(a0),d5
  980.         roxr.l    #1,d5
  981.         bra.s    ppdecr_45
  982.  
  983. ppdecr_54    move.l    -(a0),d5
  984.         roxr.l    #1,d5
  985.         bra.s    ppdecr_46
  986.  
  987. ppdecr_55    move.l    -(a0),d5
  988.         roxr.l    #1,d5
  989.         bra.s    ppdecr_47
  990.  
  991. ppdecr_56    move.l    -(a0),d5
  992.         roxr.l    #1,d5
  993.         bra.s    ppdecr_48
  994.  
  995. ppdecr_57    move.l    -(a0),d5
  996.         roxr.l    #1,d5
  997.         bra.s    ppdecr_49
  998.  
  999.         dc.b    $00,$80,$40,$C0,$20,$A0,$60,$E0
  1000.         dc.b    $10,$90,$50,$D0,$30,$B0,$70,$F0
  1001.         dc.b    $08,$88,$48,$C8,$28,$A8,$68,$E8
  1002.         dc.b    $18,$98,$58,$D8,$38,$B8,$78,$F8
  1003.         dc.b    $04,$84,$44,$C4,$24,$A4,$64,$E4
  1004.         dc.b    $14,$94,$54,$D4,$34,$B4,$74,$F4
  1005.         dc.b    $0C,$8C,$4C,$CC,$2C,$AC,$6C,$EC
  1006.         dc.b    $1C,$9C,$5C,$DC,$3C,$BC,$7C,$FC
  1007.         dc.b    $02,$82,$42,$C2,$22,$A2,$62,$E2
  1008.         dc.b    $12,$92,$52,$D2,$32,$B2,$72,$F2
  1009.         dc.b    $0A,$8A,$4A,$CA,$2A,$AA,$6A,$EA
  1010.         dc.b    $1A,$9A,$5A,$DA,$3A,$BA,$7A,$FA
  1011.         dc.b    $06,$86,$46,$C6,$26,$A6,$66,$E6
  1012.         dc.b    $16,$96,$56,$D6,$36,$B6,$76,$F6
  1013.         dc.b    $0E,$8E,$4E,$CE,$2E,$AE,$6E,$EE
  1014.         dc.b    $1E,$9E,$5E,$DE,$3E,$BE,$7E,$FE
  1015. myDecrTab    dc.b    $01,$81,$41,$C1,$21,$A1,$61,$E1
  1016.         dc.b    $11,$91,$51,$D1,$31,$B1,$71,$F1
  1017.         dc.b    $09,$89,$49,$C9,$29,$A9,$69,$E9
  1018.         dc.b    $19,$99,$59,$D9,$39,$B9,$79,$F9
  1019.         dc.b    $05,$85,$45,$C5,$25,$A5,$65,$E5
  1020.         dc.b    $15,$95,$55,$D5,$35,$B5,$75,$F5
  1021.         dc.b    $0D,$8D,$4D,$CD,$2D,$AD,$6D,$ED
  1022.         dc.b    $1D,$9D,$5D,$DD,$3D,$BD,$7D,$FD
  1023.         dc.b    $03,$83,$43,$C3,$23,$A3,$63,$E3
  1024.         dc.b    $13,$93,$53,$D3,$33,$B3,$73,$F3
  1025.         dc.b    $0B,$8B,$4B,$CB,$2B,$AB,$6B,$EB
  1026.         dc.b    $1B,$9B,$5B,$DB,$3B,$BB,$7B,$FB
  1027.         dc.b    $07,$87,$47,$C7,$27,$A7,$67,$E7
  1028.         dc.b    $17,$97,$57,$D7,$37,$B7,$77,$F7
  1029.         dc.b    $0F,$8F,$4F,$CF,$2F,$AF,$6F,$EF
  1030.         dc.b    $1F,$9F,$5F,$DF,$3F,$BF,$7F,$FF
  1031.         dc.b    $00,$01,$01,$02,$02,$02,$02,$03
  1032.         dc.b    $03,$03,$03,$03,$03,$03,$03,$04
  1033.         dc.b    $04,$04,$04,$04,$04,$04,$04,$04
  1034.         dc.b    $04,$04,$04,$04,$04,$04,$04,$05
  1035.         dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  1036.         dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  1037.         dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  1038.         dc.b    $05,$05,$05,$05,$05,$05,$05,$06
  1039.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1040.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1041.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1042.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1043.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1044.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1045.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1046.         dc.b    $06,$06,$06,$06,$06,$06,$06,$07
  1047.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1048.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1049.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1050.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1051.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1052.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1053.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1054.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1055.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1056.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1057.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1058.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1059.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1060.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1061.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1062.         dc.b    $07,$07,$07,$07,$07,$07,$07,$00
  1063.  
  1064. *****************************************************************************
  1065.  
  1066. StrCount    set    0
  1067.  
  1068. StringTab    ADDSTR    PrgName
  1069.         ADDSTR    Usage
  1070.         ADDSTR    FileErr
  1071.         ADDSTR    ReadErr
  1072.         ADDSTR    ModErr
  1073.         ADDSTR    MemErr
  1074.         ADDSTR    Break
  1075.         ADDSTR    ReqNeed
  1076.         ADDSTR    LoadErr
  1077.         ADDSTR    Return
  1078.  
  1079. PrgName.str    dc.b    $9B,'3;33mModInfo 1.2',$9b,'0m © 1992'
  1080.         dc.b    ' by Gunther Nikl',10,10,0
  1081.         even
  1082. Usage.str    dc.b    $9B,'1;31mUsage:',$9b,'0m ModInfo '
  1083.         dc.b    '[ File File ... ]',10
  1084.         dc.b    '         or',10,'       ModInfo '
  1085.         dc.b    '[ -d Directory ]',10,0
  1086.         even
  1087. FileErr.str    dc.b    '%s not found !',10,0
  1088.         even
  1089. ReadErr.str    dc.b    '%s - read error !',10,0
  1090.         even
  1091. ModErr.str    dc.b    '%s - not a st/nt/pt module !',10,0
  1092.         even
  1093. MemErr.str    dc.b    'not enough memory !',10,0
  1094.         even
  1095. Break.str    dc.b    '***Break',10,0
  1096.         even
  1097. ReqNeed.str    dc.b    'no %s for filerequest !',10,0
  1098.         even
  1099. LoadErr.str    dc.b    'nothing selected !',10,0
  1100.         even
  1101. Return.str    dc.b    10,$9B,'0 p',$9B,'3;31mANY KEY TO QUIT !',$9b,'0m',0
  1102.         even
  1103.  
  1104. Template.str    dc.b    '| $',$ff,' - %4d | $',$ff,' - %4d '
  1105.         dc.b    '| $',$ff,' - %4d | $',$ff,' - %4d |',10
  1106.         even
  1107. HexString.str    dc.b    '0123456789ABCDEF'
  1108.         even
  1109. ECmds.str    dc.b    'e-cmds',0
  1110.         even
  1111. Patts.str    dc.b    'pattern: %3d',0
  1112.         even
  1113. SongLen.str    dc.b    'songlen: %3d',0
  1114.         even
  1115. ReqTitle.str    dc.b    'Load File(s) -> SHIFT for Multi Select',0
  1116.         even
  1117. ConName.str    dc.b    'RAW:0/10/640/150/ModInfo 1.2',0
  1118.         even
  1119.  
  1120. DosName        dc.b    'dos.library',0
  1121.         even
  1122. ReqName        dc.b    'req.library',0
  1123.         even
  1124.  
  1125.